#include "client.h"


////////////////////////
//
//  Constructeur
//
////////////////////////
Client::Client()
{
    m_id = 0;
    m_nomLieu = "";
    m_typeClient = "";
    m_adresse = Adresse();
    m_dateProgrammation = QDate();
    m_commentaire = "";
    m_distance = 0;
}
Client::Client(QString nomLieu, QString typeClient)
{
    m_id = 0;
    m_nomLieu = nomLieu;
    m_typeClient = typeClient;
    m_adresse = Adresse();
    m_dateProgrammation = QDate();
    m_commentaire = "";
    m_distance = 0;

}
Client::Client(QString nomLieu, QString typeClient, Adresse adresse, Contact contact)
{
    m_id = 0;
    m_nomLieu = nomLieu;
    m_typeClient = typeClient;
    m_adresse = adresse;
    m_dateProgrammation = QDate();
    m_commentaire = "";
    m_listeContact.append(contact);
    m_distance = 0;
}
Client::Client(QSqlQuery query)
{
    m_id = query.value(0).toInt();
    m_nomLieu = FirstUpperThenLower(query.value(1).toString());
    m_typeClient = query.value(2).toString();
    m_adresse = Adresse(query.value(3).toString(),
                        query.value(4).toString(),
                        query.value(5).toString(),
                        FirstUpperThenLower(query.value(6).toString()));
    m_adresse.setDepartement(query.value(7).toString());
    m_dateProgrammation = query.value(8).toDate();
    m_commentaire = query.value(9).toString();
    m_distance = query.value(10).toInt();

}
////////////////////////
//
//  Accesseur
//
////////////////////////
void Client::setNomLieu(QString nomLieu)
{
    m_nomLieu = nomLieu;
}
void Client::setTypeClient(QString typeClient)
{
    m_typeClient = typeClient;
}
void Client::setAdresse(Adresse adresse)
{
    m_adresse = adresse;
}
void Client::setListeContact(ListeContact listeContact)
{
    m_listeContact = listeContact;
}
void Client::setDateProgrammation(QDate dateProgrammation)
{
    m_dateProgrammation = dateProgrammation;
}
void Client::setCommentaire(QString commentaire)
{
    m_commentaire = commentaire;
}
void Client::addCommentaire(QString commentaire)
{
    m_commentaire += "/n- " + commentaire;
}
void Client::setRemarques(QString remarques)
{
    m_remarques = remarques;
}
void Client::setListDateContact(ListeDateContact listDateContact)
{
    m_listDateContact = listDateContact;
}
void Client::setListDateObtenu(QList<DateObtenu> listDateObtenu)
{
    m_listDateObtenu = listDateObtenu;
}
void Client::setDistance(int distance)
{
    m_distance = distance;
}
QString Client::getNomLieu()const
{
    return m_nomLieu;
}
QString Client::getTypeClient()const
{
    return m_typeClient;
}
Adresse Client::getAdresse()const
{
    return m_adresse;
}
ListeContact Client::getListeContact()const
{
    return m_listeContact;
}
QDate Client::getDateProgrammation()const
{
    if (m_dateProgrammation.year() >= 2000)
        return m_dateProgrammation;
    return QDate();
}
QString Client::getCommentaire()const
{
    return m_commentaire;
}
QString Client::getRemarques()const
{
    return m_remarques;
}
ListeDateContact Client::getListDateContact()const
{
    return m_listDateContact;
}
QList<DateObtenu> Client::getListDateObtenu()const
{
    return m_listDateObtenu;
}
int Client::getDistance()const
{
    return m_distance;
}
void Client::BindValues(QSqlQuery &query, QStringList champs)
{
    query.bindValue(":" + NomChampNomLieu, this->getNomLieu());
    query.bindValue(":" + NomChampTypeClient, this->getTypeClient());
    query.bindValue(":" + Adresse::NomChampNumeroRue, this->getAdresse().getNumeroRue());
    query.bindValue(":" + Adresse::NomChampNomRue, this->getAdresse().getRue());
    query.bindValue(":" + Adresse::NomChampCodePostal, this->getAdresse().getCodePostal());
    query.bindValue(":" + Adresse::NomChampVille, this->getAdresse().getVille());
    query.bindValue(":" + Adresse::NomChampDepartement, this->getAdresse().getDepartement());
    query.bindValue(":" + NomChampDateProgrammation, this->getDateProgrammation().toString("yyyy-MM-dd"));
    query.bindValue(":" + NomChampCommentaires, this->getCommentaire());
    query.bindValue(":" + NomChampDistance, this->getDistance());

}
////////////////////////
//
//
//
////////////////////////
void Client::addContact(Contact contact)
{
    m_listeContact.append(contact);
}
void Client::addListeContact(ListeContact liste)
{
    m_listeContact.append(liste);
}
void Client::addDateContact(DateContact dateContact)
{
    m_listDateContact.append(dateContact);
}
void Client::addListeDateContact(ListeDateContact liste)
{
    m_listDateContact.append(liste);
}
void Client::addDateObtenu(DateObtenu dateObtenu)
{
    m_listDateObtenu.append(dateObtenu);
}
void Client::addListeDateObtenu(QList<DateObtenu> liste)
{
    m_listDateObtenu.append(liste);
}
void Client::replaceContact(int index, Contact contact)
{
    m_listeContact.replace(index, contact);
}
void Client::replaceDateContact(int index, DateContact dateContact)
{
    m_listDateContact.replace(index, dateContact);
}
void Client::removeContact(Contact contact)
{
    m_listeContact.removeOne(contact);
}
void Client::removeContact(int index)
{
    m_listeContact.removeAt(index);
}
void Client::removeDateContact(DateContact dateContact)
{
    m_listDateContact.removeOne(dateContact);
}
void Client::removeDateContact(int index)
{
    m_listDateContact.removeAt(index);
}
void Client::removeDateObtenu(DateObtenu dateObtenu)
{
    m_listDateObtenu.removeOne(dateObtenu);
}
void Client::removeDateObtenu(int index)
{
    m_listDateObtenu.removeAt(index);
}
void Client::setContactId(int index, int id)
{
    Contact t;
    t = m_listeContact.at(index);
    t.setId(id);
    m_listeContact.replace(index, t);
}
void Client::setDateContactId(int index, int id)
{
    DateContact t;
    t = m_listDateContact.at(index);
    t.setId(id);
    m_listDateContact.replace(index, t);
}
void Client::setDateObtenuId(int index, int id)
{
    DateObtenu t;
    t = m_listDateObtenu.at(index);
    t.setId(id);
    m_listDateObtenu.replace(index, t);
}
void Client::ValideDateContact(int index)
{
    DateContact t;
    t = m_listDateContact.at(index);
    t.setSuccess(true);
    m_listDateContact.replace(index, t);
}

////////////////////////
//
//  Operateur
//
////////////////////////
bool Client::operator==(Client const& client)
{

    return (m_nomLieu.toLower() == client.getNomLieu().toLower()) && (m_typeClient.toLower() == client.getTypeClient().toLower());
}
////////////////////////
//
//  static SQL
//
////////////////////////
const QString Client::NomChampNomLieu = QString("NomLieu");
const QString Client::NomChampTypeClient = QString("TypeClient");
const QString Client::NomChampDistance = QString("distance");
const QString Client::NomChampDateProgrammation = QString("DateProgrammation");
const QString Client::NomChampCommentaires = QString("Commentaires");

QStringList Client::ListeChampSQL()
{
    QStringList l;
    l << NomChampId << NomChampNomLieu << NomChampTypeClient << Adresse::ListeChampSQL()
       << NomChampDateProgrammation << NomChampCommentaires << NomChampDistance ;
    return l;
}
QStringList Client::ListeTypeDataSQL()
{
   // INTEGER PRIMARY KEY ASC
    QStringList l;
    l << TypeVarId << "varchar(30)" << "varchar(30)" << Adresse::ListeTypeDataSQL()
      << "char(20)" << "DATE" << "text" << "char(20)" << "char(20)" << "double";
    return l;
}
QStringList Client::SQLWhere()const
{
    QStringList l;
    l << NomChampNomLieu << m_nomLieu << NomChampTypeClient << m_typeClient ;
    return l;
}
QString Client::SetQuery()const
{
    return NomChampNomLieu + "=:" + NomChampNomLieu.toLower() + ", " +
           NomChampTypeClient + "=:" + NomChampTypeClient.toLower() + ", " +
           m_adresse.SetQuery() + ", " +
           NomChampDateProgrammation + "=:" + NomChampDateProgrammation.toLower() + ", " +
           NomChampCommentaires + "=:" + NomChampCommentaires.toLower() + ", " +
           NomChampDistance + "=:" + NomChampDistance.toLower()
           + " WHERE id=:id";
}
QStringList Client::SetBindValues()const
{
//
    QStringList l;
    l << NomChampNomLieu.toLower() << m_nomLieu
      << NomChampTypeClient.toLower() << m_typeClient
      << m_adresse.SetBindValues()
      << NomChampDateProgrammation.toLower() << m_dateProgrammation.toString("yyyy-MM-dd")
      << NomChampCommentaires.toLower() << m_commentaire
      << NomChampDistance.toLower() << QString::number(m_distance)
      << "id" << QString::number(m_id);
    return l;
}

////////////////////////
//
//
//
////////////////////////
bool Client::Compare(Client *client)
{
    return (m_nomLieu.toLower() == client->getNomLieu().toLower()) && (m_typeClient.toLower() == client->getTypeClient().toLower())
            && (m_dateProgrammation == client->getDateProgrammation()) && (m_adresse == client->getAdresse()) && (m_commentaire == client->getCommentaire())
            && (m_listeContact == client->getListeContact()) && (m_distance == client->getDistance());
}
bool Client::ContainsChar(QString filtre)
{
    if (m_nomLieu.contains(filtre, Qt::CaseInsensitive))
        return true;
    if (m_typeClient.contains(filtre, Qt::CaseInsensitive))
        return true;
    if (m_adresse.getVille().contains(filtre, Qt::CaseInsensitive))
        return true;
    if (m_adresse.getDepartement().contains(filtre, Qt::CaseInsensitive))
        return true;
    if (m_adresse.getCodePostal().contains(filtre, Qt::CaseInsensitive))
        return true;
    if (m_dateProgrammation.toString("MMMM").contains(filtre, Qt::CaseInsensitive))
        return true;

    return false;
}
QString Client::FirstUpperThenLower(QString s)
{
    QString result = s.toLower();
    result[0] = result[0].toUpper();
    return result;
}
